home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / progut~1 / stdwin.zoo / bed / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-10-18  |  2.9 KB  |  182 lines

  1. #include <stdio.h>
  2. #include "bed.h"
  3.  
  4. extern char    *rindex () ;
  5.  
  6. extern int    sqrsize ;
  7.  
  8. extern int    map_width ;
  9. extern int    map_height ;
  10.  
  11. extern char    *raster ;
  12. extern int    raster_lenght ;
  13. extern int    stride ;
  14.  
  15. extern char    *fname ;
  16. extern char    *title ;
  17.  
  18. extern WINDOW    *win ;
  19.  
  20. extern bool    changed ;
  21.  
  22. char
  23. *strip (fname)
  24.     char    *fname ;
  25. {
  26.     char    *p ;
  27.  
  28.     if ((p = rindex (fname, '/')) == NULL &&    /* UNIX              */
  29.         (p = rindex (fname, '\\')) == NULL &&    /* GEMDOS & MSDOS     */
  30.         (p = rindex (fname, ':')) == NULL)
  31.         return (fname) ;
  32.     return (p + 1) ;
  33. }
  34.  
  35. bool
  36. input(fp)
  37.     FILE *fp;
  38. {
  39.     int    value ;
  40.     char    ibuf[81] ;
  41.     char    *id ;
  42.     char    *p ;
  43.     char    *type ;
  44.     int    i ;
  45.  
  46.     for (;;) {
  47.         if (fgets (ibuf, 81, fp) == NULL)
  48.             /*
  49.             ** EOF
  50.             */
  51.             break ;
  52.  
  53.         if ((int)strlen (ibuf) == 80) {
  54.             /*
  55.             ** Line too long, not a bitmap file
  56.             */
  57.             fclose (fp) ;
  58.             return (FALSE) ;
  59.         }
  60.  
  61.         if (strncmp (ibuf, "#define ", (size_t)8) == 0) {
  62.             id = ibuf + 8 ;
  63.             if ((type = rindex (id, '_')) == NULL)
  64.                 type = id ;
  65.             else
  66.                 type++ ;
  67.  
  68.             if (!strncmp (type, "width", (size_t)5)) {
  69.                 map_width = atoi (type + 5) ;
  70.             }
  71.  
  72.             if (!strncmp (type, "height", (size_t)6)) {
  73.                 map_height = atoi (type + 6) ;
  74.             }
  75.  
  76.             continue ;
  77.         }
  78.  
  79.         if (strncmp (ibuf, "static unsigned char ", (size_t)21) == 0)
  80.             id = ibuf + 21 ;
  81.         else if (strncmp (ibuf, "static char ", (size_t)12) == 0)
  82.             id = ibuf + 12 ;
  83.         else
  84.             continue ;
  85.  
  86.         if ((type = rindex (id, '_')) == NULL)
  87.             type = id ;
  88.         else
  89.             type++ ;
  90.  
  91.         if (strncmp (type, "bits[]", (size_t)6) != 0)
  92.             continue ;
  93.  
  94.         newraster () ;
  95.  
  96.         for (i = 0, p = raster ; i < raster_lenght ; ++i, ++p) {
  97.             if (fscanf (fp, " 0x%2x%*[,}]%*[  \n]", &value) != 1) {
  98.                 free (raster) ;
  99.                 raster = NULL ;
  100.                 fclose (fp) ;
  101.                 return (FALSE) ;
  102.             }
  103.             *p = value ;
  104.         }
  105.     }
  106.  
  107.     fclose (fp) ;
  108.     return (TRUE) ;
  109. }
  110.  
  111. bool
  112. readbitmap ()
  113. {
  114.     FILE    *fp ;
  115.     char    namebuf[256] ;
  116.  
  117.     if (fname == NULL) {
  118.         namebuf[0] = 0 ;
  119.  
  120.         if (!waskfile ("Read file", namebuf, (int)(sizeof (namebuf)), FALSE))
  121.             return (FALSE) ;
  122.  
  123.         fname = strdup (namebuf) ;
  124.         title = strip (fname) ;
  125.  
  126.         wsettitle (win, title) ;
  127.     }
  128.  
  129.     fp = fopen (fname, "r") ;
  130.     if (fp == NULL) {
  131.         perror(fname);
  132.         return (FALSE) ;
  133.     }
  134.  
  135.     return (input(fp)) ;
  136. }
  137.  
  138. void
  139. output(fp)
  140.     FILE    *fp ;
  141. {
  142.     int    i ;
  143.  
  144.     fprintf (fp, "#define %s_width\t%d\n", title, map_width) ;
  145.     fprintf (fp, "#define %s_height\t%d\n", title, map_height) ;
  146.     fprintf (fp, "static char %s_bits[] {\n   0x%02x", title,
  147.                             raster[0] & 0xFF) ;
  148.  
  149.     for (i = 1 ; i < raster_lenght ; ++i) {
  150.         fprintf (fp, i % 12 ? ", " : ",\n   ") ;
  151.         fprintf (fp, "0x%02x", raster[i] & 0xFF) ;
  152.     }
  153.     fprintf (fp, "};\n") ;
  154. }
  155.  
  156. bool
  157. writebitmap()
  158. {
  159.     FILE    *fp;
  160.     char    namebuf[256];
  161.     
  162.     namebuf[0] = '\0' ;
  163.     if (fname == NULL) {
  164.         if (!waskfile ("Save as", namebuf, (int)(sizeof (namebuf)), TRUE))
  165.             return (FALSE) ;
  166.         fname = strdup (namebuf) ;
  167.         title = strip (namebuf) ;
  168.         wsettitle (win, title) ;
  169.     }
  170.  
  171.     fp = fopen (fname, "w") ;
  172.     if (fp == NULL) {
  173.         wperror (fname) ;
  174.         return (FALSE) ;
  175.     }
  176.  
  177.     output (fp) ; 
  178.     fclose (fp) ;
  179.     return (TRUE) ;
  180. }
  181.  
  182.